home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / The Hacks! / Y2K-OK / y2k_ok.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-06-21  |  4.1 KB  |  200 lines  |  [TEXT/CWIE]

  1. /*
  2.     Y2K-ok        Fix the year 2000 problem (!)
  3.  
  4.     MacHack98    bh              noEsis Software Construction 
  5.                 bspence        bspence@mdli.com
  6. */
  7.  
  8. //****************************************************************
  9. //                                                I N C L U D E S
  10.  
  11. #include <Types.h>
  12. #include <Memory.h>
  13. #include <A4Stuff.h>
  14. #include <SetUpA4.h>
  15. #include <Quickdraw.h>
  16. #include <LowMem.h>
  17. #include <Errors.h>
  18. #include <Gestalt.h>
  19. #include <Resources.h>
  20. #include <Events.h>
  21. #include <Windows.h>
  22. #include <Retrace.h>
  23.  
  24. #include <MixedMode.h>
  25.  
  26.  
  27.  
  28. //****************************************************************
  29. //                                                C O N S T A N T S
  30. #define FALSE                false
  31. #define TRUE                true
  32. #define NIL                    0L
  33.  
  34.  
  35. //******************************
  36. //    The 68k code goes in a normal INIT resource.
  37. //    Be sure this is set to "system heap/locked".
  38.  
  39. #define kInitRezType        'INIT'
  40. #define kInitRezID            300
  41.  
  42. #define kMinSystemVersion    (0x0603)
  43.  
  44.  
  45. // ShowInit 
  46. #define kOkMac    128
  47. #define kNotMac    132
  48.  
  49.  
  50. //****************************************************************
  51. //                                                G L O B A L S
  52.  
  53. struct NInitGlobals
  54. {
  55.     SysEnvRec        gSystemInfo;
  56.     long            gInfo;        // 1=68k,2=PPC
  57.     
  58.     VBLTask            gVBLTask;
  59.  
  60. };
  61. typedef struct NInitGlobals NInitGlobals;
  62.  
  63. NInitGlobals                *gP;
  64.  
  65.  
  66. //****************************************************************
  67. //                                                F O R W A R D S
  68.  
  69. OSErr DoInstall( void);
  70. pascal void DoVBL(void);
  71.  
  72.  
  73. extern void ShowIconFamilyAnim(short iconId, short cnt);
  74. extern void ShowIconFamily(short iconId);
  75.  
  76.  
  77. //****************************************************************
  78. void main( void )
  79. {
  80.     long        oldA4, lRes;
  81.     Handle        initH = nil;        /* Handle to our own INIT resource */
  82.     OSErr        err = noErr;
  83.     unsigned long        t;
  84.     
  85.     oldA4 = SetCurrentA4();            /* Get the proper value of A4 into A4 */
  86.     RememberA4();                    /* save into self-modifying code */
  87.  
  88.  
  89.     // Allocate globals struct
  90.     gP = (NInitGlobals*) NewPtrSysClear( sizeof(NInitGlobals));
  91.     if ( !gP ) {
  92.         err = memFullErr;
  93.         goto DONE;
  94.     }
  95.     
  96.      // Get minimal System Info:
  97.     err = SysEnvirons( 1, &gP->gSystemInfo );
  98.     if ( err )
  99.         goto DONE;
  100.       if ( gP->gSystemInfo.systemVersion < kMinSystemVersion ) {
  101.          err = -1;
  102.          goto DONE;
  103.      }
  104.  
  105.     // Prepare to Detach ourselves...
  106.     initH = Get1Resource( kInitRezType, kInitRezID );
  107.     if ( !initH ) {
  108.         err = resNotFound;
  109.         goto DONE;
  110.     }
  111.  
  112.     // Call Gestalt:
  113.     // Gestalt will return an err when SysArc is unimplemented
  114.     err = Gestalt( gestaltSysArchitecture, &gP->gInfo );
  115.     if ( err) gP->gInfo = gestalt68k;
  116.  
  117.     
  118.     err = DoInstall();    
  119.  
  120.  
  121.     DONE:
  122.     if ( err ) {
  123.         ShowIconFamily( kNotMac );
  124.         if ( gP )
  125.             DisposePtr( (Ptr)gP );
  126.     } else {
  127.         ShowIconFamilyAnim( kOkMac, 4 );    
  128.         DetachResource( initH);    
  129.         MoveHHi( (Handle)initH); HLock( (Handle)initH);
  130.     }
  131.     
  132.     RestoreA4( oldA4 );                    /* restore previous value of A4 */
  133. }
  134.  
  135.  
  136.  
  137. //****************************************************************
  138. //    DoInstall
  139. //****************************************************************
  140. #define kVBLStartInterval    200
  141. #define kVBLJamInterval        1
  142.  
  143. OSErr DoInstall( void )
  144. {
  145.     long    oldA4;
  146.     NInitGlobals *locGPtr;
  147.  
  148.     oldA4 = SetUpA4();    
  149.     locGPtr = gP;
  150.     RestoreA4( oldA4 );    
  151.  
  152.     locGPtr->gVBLTask.qLink        = 0;
  153.     locGPtr->gVBLTask.qType        = vType;
  154.     locGPtr->gVBLTask.vblAddr    = DoVBL;
  155.     locGPtr->gVBLTask.vblCount    = kVBLStartInterval;
  156.     locGPtr->gVBLTask.vblPhase    = 0;
  157.     
  158.     VInstall( (QElemPtr)&locGPtr->gVBLTask);
  159.     
  160.     return noErr;
  161. }
  162.  
  163.  
  164. //****************************************************************
  165. //    DoVBL
  166. //****************************************************************
  167. VBLTask    *GetVBLInfo( void ) = { 0x2008 };        /* MOVE.L    A0,D0 */
  168.  
  169. #define kY2K_Ticks        0xB492F3FF
  170.  
  171. pascal void DoVBL(void)
  172. {
  173.     VBLTask    *curVBLInfo;
  174.     unsigned long    cmpT;
  175.     
  176.     curVBLInfo = GetVBLInfo();
  177.     
  178.     curVBLInfo->vblCount    = kVBLStartInterval;
  179.     
  180.     cmpT = kY2K_Ticks - *(unsigned long*)0x20C;
  181.     if ( cmpT < 0x10 ) {
  182.     
  183.         curVBLInfo->vblCount    = kVBLJamInterval;
  184.         // Keep that Bad 'ol Year 2000 at Bay forever !
  185.         *(unsigned long*)0x20C  = kY2K_Ticks - 0xF;
  186.  
  187.     } else if ( cmpT < 0x100 ) {
  188.     
  189.         curVBLInfo->vblCount    = kVBLJamInterval;
  190.         // or slow it down a little
  191.         *(unsigned long*)0x20C  = *(unsigned long*)0x20C - 1;
  192.     } 
  193.  
  194.     return;
  195. }
  196.  
  197.  
  198. //***********************************************************************************
  199. //                                                        E N D   O F   L I S T I N G
  200.